package com.w7vm.menuweb.managerBean;


import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;

import com.w7vm.menuweb.entity.CardapioBuffetWeb;
import com.w7vm.menuweb.entity.CardapioEspecialidadeWeb;
import com.w7vm.menuweb.entity.CardapioInfantilWeb;
import com.w7vm.menuweb.entity.CardapioLaCarteWeb;
import com.w7vm.menuweb.entity.CardapioSelfServiceWeb;
import com.w7vm.menuweb.entity.DescontoPagamentoSy;
import com.w7vm.menuweb.entity.RestauranteFilialWeb;
import com.w7vm.menuweb.entity.RestauranteSedeWeb;
import com.w7vm.menuweb.facade.CardapioG1Facade;
import com.w7vm.menuweb.facade.CardapioG2Facade;
import com.w7vm.menuweb.facade.CardapioG3Facade;
import com.w7vm.menuweb.facade.ContratoFacade;
import com.w7vm.menuweb.facade.RestauranteFilialFacade;
import com.w7vm.menuweb.utility.Constantes;
import com.w7vm.menuweb.vo.CardapioVO;
import com.w7vm.menuweb.vo.PlanoVO;
import com.w7vm.menuweb.vo.RestauranteVO;



@ManagedBean
@ViewScoped
public class AlteracaoPlanoMB {
	
	@EJB
	private RestauranteFilialFacade filialEJB;
	@EJB
	private CardapioG1Facade cardapioG1EJB;
	@EJB
	private CardapioG2Facade cardapioG2EJB;
	@EJB
	private CardapioG3Facade cardapioG3EJB;
	@EJB
	private ContratoFacade contratoEJB;

	
	private LoginMB loginObj = new LoginMB();
	public Constantes constObj = new Constantes();

	
	private PlanoVO selectPlanoVO;

	private boolean downFilial = false;
	private boolean downCardapio = false;
	private boolean downFilialCard = false;
	private boolean downgrade = false;
	private boolean upgrade = false;
	private String msgUpDownGradePlano;
	private String downUpGrade;
	private RestauranteVO restauranteSelect = new RestauranteVO();
	private List<RestauranteVO> restauranteSedeFilialL = new ArrayList<RestauranteVO>();
	private List<CardapioVO> cardapioAtivoRestL = new ArrayList<CardapioVO>();


	
	public AlteracaoPlanoMB() {
		super();
		// TODO Auto-generated constructor stub
	}


	/*
	* ========================================== END METHOD CORE ==========================================================================
	* Operaçao :: Alteração de Plano -- UPGRADE PLANO | DOWNSIZE PLANO
	* =====================================================================================================================================
	*/
	public void validaOperacaoUpDowPlano(){
	        System.out.println("[JSF][validaOperacaoUpDowPlano()]");
	        
	        
	        int difFilial, difBenefCardapio = 0; 
	        String text01, text02 = null, textTotal = null;
	        		
	        int qtdeRestaurantePlano = (Integer) loginObj.getSessao("QtdeRestaurantePlano");
	        int qtdeCardapioPlano = (Integer) loginObj.getSessao("QtdeCardapioPlano");
	        double valorPlano = (Double) loginObj.getSessao("ValorPlano");
	        int periodoPlano = (Integer) loginObj.getSessao("PeriodoPlano");
	        int qtdeFilialCadastrado = (Integer) loginObj.getSessao("QdteRestauranteFilialCadastrado");
	        int qtdeCardapioContrato = (Integer) loginObj.getSessao("QtdeCardapioAtivoCadastrado");

	        System.out.println("1 qtdeRestaurantePlano "+ qtdeRestaurantePlano);
	        System.out.println("2 qtdeCardapioPlano "+ qtdeCardapioPlano);
	        System.out.println("3 valorPlano "+ valorPlano);
	        System.out.println("4 periodoPlano "+ periodoPlano);
	        System.out.println("5 qtdeFilialCadastrado "+ qtdeFilialCadastrado);
	        System.out.println("6 qtdeCardapioContrato "+ qtdeCardapioContrato);
	        System.out.println(" ------");

	        System.out.println("7 selectPlanoVO.getBenQtdeFilial() "+ selectPlanoVO.getBenQtdeFilial());
	        System.out.println("8  selectPlanoVO.getBenQtdeCardapio()"+ selectPlanoVO.getBenQtdeCardapio());

	        
	        // Plano selecionado diferente do plano ja contratado
	        if((selectPlanoVO.getBenQtdeFilial() != qtdeRestaurantePlano ) ||
	        (selectPlanoVO.getBenQtdeCardapio() != qtdeCardapioPlano) || 
	        (selectPlanoVO.getValor() != valorPlano) ||
	        (selectPlanoVO.getBenPeriodoAssinatura() != periodoPlano)){
	        	
	        	// PLANO UPGRADE (+) (Restaurante / Cardapio) 
		        if((selectPlanoVO.getBenQtdeFilial() > qtdeRestaurantePlano) &&
		        		(selectPlanoVO.getBenQtdeCardapio() > qtdeCardapioPlano)){
		        	
			        System.out.println("[JSF][validaOperacaoUpDowPlano() -- PLANO UPGRADE]");

		        	upgrade = true;
		        	setDownUpGrade("+");
		        	difFilial = selectPlanoVO.getBenQtdeFilial() - qtdeFilialCadastrado;
		        	difBenefCardapio = selectPlanoVO.getBenQtdeCardapio() - qtdeCardapioContrato;
		        	
		        	setMsgUpDownGradePlano("PARABÉNS !! O plano selecionado é superior ao plano atual, possibilitando cadastrar mais "+ difFilial+ " novos restaurantes, e" +
		        			difBenefCardapio+ " novos cardápios. Deseja cadastra-los agora?");
					RequestContext context = RequestContext.getCurrentInstance();
					context.execute("PF('dlgUpgradePlano').show();");
		        }
		        // PLANO DOWNGRADE (-)
		        else if((selectPlanoVO.getBenQtdeFilial() < qtdeRestaurantePlano) &&
		        		(selectPlanoVO.getBenQtdeCardapio() < qtdeCardapioPlano)){

			        System.out.println("[JSF][validaOperacaoUpDowPlano() -- PLANO DOWNGRADE]");

		        	downgrade = true;
		        	setDownUpGrade("-");
	        		difFilial = qtdeFilialCadastrado - selectPlanoVO.getBenQtdeFilial();
	        		difBenefCardapio = qtdeCardapioContrato - selectPlanoVO.getBenQtdeCardapio();

		        	text01 = "O plano selecionado é inferior ao plano atual ";
		        	
		        	if((qtdeFilialCadastrado > selectPlanoVO.getBenQtdeFilial()) &&
		        			qtdeCardapioContrato > selectPlanoVO.getBenQtdeCardapio()){
		        		
			        	text02 = "sendo necessário desativar "+ difFilial + " restaurante(s) do contato,  e "+ difBenefCardapio + 
			        			" cardápio(s) que está associado a filias desativada!";
			        	downFilialCard = true;
		        	}
		        	else if((qtdeFilialCadastrado > selectPlanoVO.getBenQtdeFilial()) &&
		        			qtdeCardapioContrato < selectPlanoVO.getBenQtdeCardapio()){

			        	text02 = "sendo necessário desativar "+ difFilial + " restaurante(s) do contato";
			        	downFilial = true;
		        	}
		        	else if((qtdeFilialCadastrado < selectPlanoVO.getBenQtdeFilial()) &&
		        			qtdeCardapioContrato > selectPlanoVO.getBenQtdeCardapio()){

		        		text02 = "sendo necessário desativar "+ difBenefCardapio + " cardápio(s) que estão associado aos restaurante(s)!";
			        	downCardapio = true;
		        	}
		        	else if((qtdeFilialCadastrado < selectPlanoVO.getBenQtdeFilial()) &&
		        			qtdeCardapioContrato < selectPlanoVO.getBenQtdeCardapio()){

		        		text02 = "com "+ selectPlanoVO.getBenQtdeFilial() + " restaurante(s) filial(is) e "+ selectPlanoVO.getBenQtdeCardapio()+
		        				" cardápios disponiveis para cadastro/divulgação";
		        	}
	        		textTotal = text01 + text02;
			        System.out.println("[JSF][validaOperacaoUpDowPlano() -- PLANO DOWNGRADE] "+ textTotal);


	        		setMsgUpDownGradePlano(textTotal);
		        	RequestContext context = RequestContext.getCurrentInstance();
					context.execute("PF('dlgUpDowngradePlano').show();");
		        }
	        }
	        // PLANO IGUAL (Plano selecionado igual ao contratado)
	        else{
	        	msgUpDownGradePlano = "O plano selecionado é o mesmo plano que já está contratado. Favor selecionar outro plano!";
	        	FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Plano Duplicado", msgUpDownGradePlano);
	        	RequestContext.getCurrentInstance().showMessageInDialog(message);
	        }
	 	}
	
	
	/*
	* ========================================== END METHOD CORE ==========================================================================
	* Operaçao :: Alteração de Plano -- UPGRADE PLANO | DOWNSIZE PLANO
	* =====================================================================================================================================
	*/
	public void checaCreditoPagamento(){
		System.out.println("[JFS][checaCreditoPagamento()]");
	    long vlrDesconto = loadDescontoPlano();
		System.out.println("checaCreditoPagamento DESCONTO........................."+ vlrDesconto);
		System.out.println("checaCreditoPagamento VLR_PLANO........................."+ selectPlanoVO.getValor());

		System.out.println("checaCreditoPagamento downgrade ........................."+ downgrade);
		System.out.println("checaCreditoPagamento upgrade ........................."+ upgrade);


		if(vlrDesconto > selectPlanoVO.getValor()){
			if(downgrade == true){
				RequestContext context = RequestContext.getCurrentInstance();
				context.execute("PF('dlgDownRestaurante').show();");
			}
			else if(upgrade == true){
				salvaAlteracaoPlano();
			}
		}
		else if(vlrDesconto < selectPlanoVO.getValor()){
			if(downgrade == true){
				RequestContext context = RequestContext.getCurrentInstance();
				context.execute("PF('dlgDownRestaurante').show();");
			}
			else if(upgrade == true){
				RequestContext context = RequestContext.getCurrentInstance();
				context.execute("PF('dlgFormaPagRenovacao').show();");
			}
		}
	}
	
	
	
	/*
	 * ================================== METHOD LOAD DESCONTO ================================================ -
	 * - ENTITY :: ContratoWeb
	 * - FACADE :: ContratoFacade
	 * ==========================================================================================================
	 */
	
	public long loadDescontoPlano(){
		System.out.println("[JSF][loadDescontoPlano()]");
		List<DescontoPagamentoSy> descontoL = null;
		long resultDesconto = 0;

		
		// 2.RG - Desconto é atribuido somente operação upgrade, para operação downgrade o desconto é ignorado  
		if(downUpGrade == "+"){
			descontoL = contratoEJB.preparaListaDesconto(constObj.DESCONTO_TROCAPLANO);
			int qtdeAcessoFilial = Integer.parseInt(loginObj.getSessao("QdteRestauranteFilial").toString());
			System.out.println("loadDescontoPlano qtdeAcessoFilial "+ qtdeAcessoFilial);
			long resultDescontoI = contratoEJB.defineRegraDesconto(descontoL, qtdeAcessoFilial);
			resultDesconto = resultDesconto + resultDescontoI;
		}
		return resultDesconto;
	}
	
	
	
	/*
	 * ================================== METHOD LOAD RESTAURANTES ATIVO ================================================ -
	 * - ENTITY :: ContratoWeb
	 * - FACADE :: AlteracaoPlanoFacade
	 * ==========================================================================================================
	 */
	
	public List<RestauranteVO> getRestauranteSedeFilialL() {
		System.out.println("[JSF][getRestauranteSedeFilialL]");
		
		// Busca Cardápio Por Restaurante Restaurante-Sede
		int idSede = (Integer) loginObj.getSessao("IDSede");
		List<RestauranteFilialWeb> restaurantesL = new ArrayList<RestauranteFilialWeb>();
		RestauranteVO restauranteObj = new RestauranteVO();
		
		restauranteSedeFilialL = new ArrayList<RestauranteVO>();

		restaurantesL = filialEJB.findFilialByIDMatriz(idSede);
		System.out.println("[JSF][getRestauranteSedeFilialL].... LIST SEDE restauranteSedeL..... "+ restaurantesL.size());
			
		// Verifica se o retorno Select com Filial ativa
		if(restaurantesL.size() > 0){
			for(RestauranteFilialWeb restSedeFilialObj : restaurantesL){
				// ADD Restaurante FILIAL na List retorno tela --> AlteracaoPlano.jsf
				restauranteObj = new RestauranteVO();
				restauranteObj.setIdRestauranteFilial(restSedeFilialObj.getIdRestauranteFilialWeb());
				restauranteObj.setNomeFantasia(restSedeFilialObj.getRestauranteFilialJuridicoWeb().getNomeFantasiaFilial());
				restauranteObj.setTipo(constObj.Filial);
				restauranteSedeFilialL.add(restauranteObj);
				restauranteObj = new RestauranteVO();
			}
		}
		restauranteObj = new RestauranteVO();
		String nomeFantasia = (String) loginObj.getSessao("NomeFantasiaSede");
		restauranteObj.setIdRestauranteSede(idSede);
		restauranteObj.setNomeFantasia(nomeFantasia);
		restauranteObj.setTipo(constObj.Sede);
		restauranteSedeFilialL.add(restauranteObj);

		System.out.println("[JSF][getRestauranteSedeFilialL].... LIST FILIAL "+ restauranteSedeFilialL.size());
		return restauranteSedeFilialL;
	}
	
	
	
/* ********************************************************************************************************************
 * - Method      :: GetCardapioAtivoRestL() 
 * - Description :: Carrega cardapios da empresa filial com ID_RESTAURANTE_FILIAL  
 * ********************************************************************************************************************/
	public List<CardapioVO> cardapioAtivoRestauranteL(){
		System.out.println("[JSF][getCardapioAtivoRestL()]");
		
		List<CardapioBuffetWeb> cardBuffetL = new ArrayList<CardapioBuffetWeb>();
		List<CardapioLaCarteWeb> cardLaCarteL = new ArrayList<CardapioLaCarteWeb>();
		List<CardapioSelfServiceWeb> cardSelfServiceL = new ArrayList<CardapioSelfServiceWeb>();
		List<CardapioInfantilWeb> cardInfantilL = new ArrayList<CardapioInfantilWeb>();
		List<CardapioEspecialidadeWeb> cardEspecialidadeL = new ArrayList<CardapioEspecialidadeWeb>();

		CardapioVO cardRestauranteObj = new CardapioVO();
		int idRestaurante = 0;
		System.out.println("[JSF] restauranteSelect... .TAMANHO getNomeFantasia...."+ restauranteSelect.getNomeFantasia());

		/*
		if(restauranteSelect != null){

			if(restauranteSelect.getIdRestauranteSede() != 0){
				System.out.println("[JSF] restauranteSelect... .TAMANHO getIdRestauranteSede...."+ restauranteSelect.getIdRestauranteSede());

				idRestaurante = restauranteSelect.getIdRestauranteSede();
				cardBuffetL = cardapioG1EJB.findBuffetByIDRestauranteFilial(idRestaurante);
				cardSelfServiceL = cardapioG1EJB.findSelfServiceByIDRestauranteFilial(idRestaurante);
				cardInfantilL = cardapioG2EJB.findInfantilByIDRestauranteFilial(idRestaurante);
				cardLaCarteL = cardapioG2EJB.findLaCarteByIDRestauranteFilial(idRestaurante);
				cardEspecialidadeL = cardapioG3EJB.findEspecialidadeByIDRestauranteFilial(idRestaurante);
			}
			else if(restauranteSelect.getIdRestauranteFilial() != 0){
				System.out.println("[JSF] restauranteSelect... .TAMANHO getIdRestauranteFilial...."+ restauranteSelect.getIdRestauranteFilial());

				idRestaurante = restauranteSelect.getIdRestauranteFilial();
				cardBuffetL = cardapioG1EJB.findBuffetByIDRestauranteSede(idRestaurante);
				cardSelfServiceL = cardapioG1EJB.findSelfServiceByIDRestauranteSede(idRestaurante);
				cardInfantilL = cardapioG2EJB.findInfantilByIDRestauranteSede(idRestaurante);
				cardLaCarteL = cardapioG2EJB.findLaCarteByIDRestauranteSede(idRestaurante);
				cardEspecialidadeL = cardapioG3EJB.findEspecialidadeByIDRestauranteSede(idRestaurante);
			}
		}
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO cardBuffetL...."+ cardBuffetL.size());
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO cardSelfServiceL...."+ cardSelfServiceL.size());
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO cardInfantilL...."+ cardInfantilL.size());
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO cardLaCarteL...."+ cardLaCarteL.size());
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO cardEspecialidadeL...."+ cardEspecialidadeL.size());

		if(cardBuffetL.size() > 0){
			for(CardapioBuffetWeb cardBuffet : cardBuffetL){
				cardRestauranteObj.setIdCardapioBuffetWeb(cardBuffet.getIdCardapioBuffetWeb());
				cardRestauranteObj.setNomeCardapio(cardBuffet.getNomeBuffet());
				cardRestauranteObj.setTipoCardapio("Cardápio  "+ constObj.CARDAPIO_BUFFET);
				cardRestauranteObj.setImage(cardBuffet.getImage());
				cardRestauranteObj.setDisponibilidade(cardBuffet.getDiasSemana());
				cardapioAtivoRestL.add(cardRestauranteObj);
				cardRestauranteObj = new CardapioVO();
			}
		}
		if(cardSelfServiceL.size() > 0){
			for(CardapioSelfServiceWeb cardSelfService : cardSelfServiceL){
				cardRestauranteObj.setIdCardapioSelfServiceWeb(cardSelfService.getIdCardapioSelfServiceWeb());
				cardRestauranteObj.setNomeCardapio(cardSelfService.getNomeSelfService());
				cardRestauranteObj.setTipoCardapio("Cardápio  "+ constObj.CARDAPIO_SELFSERVICE);
				cardRestauranteObj.setImage(cardSelfService.getImage());
				cardRestauranteObj.setDisponibilidade(cardSelfService.getDiasSemana());
				cardapioAtivoRestL.add(cardRestauranteObj);
				cardRestauranteObj = new CardapioVO();
			}
		}
		if(cardInfantilL.size() > 0){
			for(CardapioInfantilWeb cardInfantil : cardInfantilL){
				cardRestauranteObj.setIdCardapioInfantilWeb(cardInfantil.getIdCardapioInfantilWeb());
				cardRestauranteObj.setNomeCardapio(cardInfantil.getNomePrato());
				cardRestauranteObj.setTipoCardapio("Cardápio  "+ constObj.CARDAPIO_INFANTIL);
				cardRestauranteObj.setImage(cardInfantil.getImage());
				cardRestauranteObj.setDisponibilidade(cardInfantil.getDiasSemana());
				cardapioAtivoRestL.add(cardRestauranteObj);
				cardRestauranteObj = new CardapioVO();					
			}
		}
		if(cardLaCarteL.size() > 0){
			for(CardapioLaCarteWeb cardLaCarte : cardLaCarteL){
				cardRestauranteObj.setIdCardapioLaCarteWeb(cardLaCarte.getIdCardapioLaCarteWeb());
				cardRestauranteObj.setNomeCardapio(cardLaCarte.getNomePrato());
				cardRestauranteObj.setImage(cardLaCarte.getImage());
				cardRestauranteObj.setDisponibilidade(cardLaCarte.getDiasSemana());
				cardRestauranteObj.setTipoCardapio("Cardápio  "+ constObj.CARDAPIO_LACARTE);
				cardapioAtivoRestL.add(cardRestauranteObj);
				cardRestauranteObj = new CardapioVO();					
			}
		}
		if(cardEspecialidadeL.size() > 0){
			for(CardapioEspecialidadeWeb cardEspecialidade : cardEspecialidadeL){
				cardRestauranteObj.setIdCardapioEspecialidadeWeb(cardEspecialidade.getIdCardapioEspecialidadeWeb());
				cardRestauranteObj.setNomeCardapio(cardEspecialidade.getNomePrato());
				cardRestauranteObj.setImage(cardEspecialidade.getImage());
				cardRestauranteObj.setDisponibilidade(cardEspecialidade.getDiasSemana());

				if(cardEspecialidade.getEspecialidade() == constObj.CARDAPIO_PIZZA){
					cardRestauranteObj.setTipoCardapio("Cardápio "+ constObj.CARDAPIO_LACARTE);
				}
				else if(cardEspecialidade.getEspecialidade() == constObj.CARDAPIO_LANCHE){
					cardRestauranteObj.setTipoCardapio("Cardápio "+ constObj.CARDAPIO_LANCHE);
				}
				else if(cardEspecialidade.getEspecialidade() == constObj.CARDAPIO_PETISCO){
					cardRestauranteObj.setTipoCardapio("Cardápio "+ constObj.CARDAPIO_PETISCO);
				}
				else if(cardEspecialidade.getEspecialidade() == constObj.CARDAPIO_SALGADO){
					cardRestauranteObj.setTipoCardapio("Cardápio "+ constObj.CARDAPIO_SALGADO);
				}
				else if(cardEspecialidade.getEspecialidade() == constObj.CARDAPIO_SOBREMESA){
					cardRestauranteObj.setTipoCardapio("Cardápio "+ constObj.CARDAPIO_SOBREMESA);
				}
				cardapioAtivoRestL.add(cardRestauranteObj);
				cardRestauranteObj = new CardapioVO();					
			}
		}
		System.out.println("[JSF][getRestaurantesL()]... .TAMANHO LIST FINAL...."+ cardapioAtivoRestL.size()); */
		return cardapioAtivoRestL;
	}

	public void setCardapioAtivoRestL(List<CardapioVO> cardapioAtivoRestL) {
		this.cardapioAtivoRestL = cardapioAtivoRestL;
	}

	
	
	/*
	 * ================================== METHOD SALVAR ALTERAÇÃO PLANO================================================ -
	 * - ENTITY :: ContratoMB
	 * - 
	 * ==========================================================================================================
	 */
		public void salvaAlteracaoPlano() {
			System.out.println("[METHOD][salvaAlteracaoPlano]");
			
			
		}





			
		/*
		 * ==============================================================================================================
		 * ==============================================================================================================
		 */


		public PlanoVO getSelectPlanoVO() {
			return selectPlanoVO;
		}

		public void setSelectPlanoVO(PlanoVO selectPlanoVO) {
			this.selectPlanoVO = selectPlanoVO;
		}

		public String getMsgUpDownGradePlano() {
			return msgUpDownGradePlano;
		}

		public void setMsgUpDownGradePlano(String msgUpDownGradePlano) {
			this.msgUpDownGradePlano = msgUpDownGradePlano;
		}



		public boolean isDownFilial() {
			return downFilial;
		}



		public void setDownFilial(boolean downFilial) {
			this.downFilial = downFilial;
		}



		public boolean isDownCardapio() {
			return downCardapio;
		}



		public void setDownCardapio(boolean downCardapio) {
			this.downCardapio = downCardapio;
		}



		public boolean isDownFilialCard() {
			return downFilialCard;
		}



		public void setDownFilialCard(boolean downFilialCard) {
			this.downFilialCard = downFilialCard;
		}



		public boolean isDowngrade() {
			return downgrade;
		}



		public void setDowngrade(boolean downgrade) {
			this.downgrade = downgrade;
		}



		public boolean isUpgrade() {
			return upgrade;
		}



		public void setUpgrade(boolean upgrade) {
			this.upgrade = upgrade;
		}



		public String getDownUpGrade() {
			return downUpGrade;
		}



		public void setDownUpGrade(String downUpGrade) {
			this.downUpGrade = downUpGrade;
		}


		public RestauranteVO getRestauranteSelect() {
			return restauranteSelect;
		}


		public void setRestauranteSelect(RestauranteVO restauranteSelect) {
			this.restauranteSelect = restauranteSelect;
		}


		public void setRestauranteSedeFilialL(List<RestauranteVO> restauranteSedeFilialL) {
			this.restauranteSedeFilialL = restauranteSedeFilialL;
		}
		

}
